import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage } from "element-plus";
import { useUserStore } from "@/store/modules/user"
import { usePermissionStore } from '@/store/modules/permission';
import router from '@/routers';
import { signature } from '@/utils/index'
// 创建axios实例 进行基本参数配置
const service = axios.create({
    // 默认请求地址，根据环境的不同可在.env 文件中进行修改
    baseURL: import.meta.env.VITE_BASE_URL,
    // 设置接口访问超时时间
    timeout: 3000000, // request timeout，
    // 跨域时候允许携带凭证
    withCredentials: true
})
//  request interceptor 接口请求拦截
service.interceptors.request.use((config: AxiosRequestConfig) => {
    /**
     * 用户登录之后获取服务端返回的token,后面每次请求都在请求头中带上token进行JWT校验
     * token 存储在本地储存中（storage）、vuex、pinia
     */
    const userStore = useUserStore();
    if (userStore.accesstoken) {
        config.headers['accesstoken'] = userStore.accesstoken
        config.headers['refreshtoken'] = userStore.refreshtoken
    }
    if (config.method == 'get') {
        let params = signature(config.params)
        config.params.timestamp = params.timestamp
        config.params.nonceStr = params.nonceStr
        config.params.sign = params.sign
    } else if (config.method == 'post') {
        let data = signature(config.data)
        config.data.timestamp = data.timestamp
        config.data.nonceStr = data.nonceStr
        config.data.sign = data.sign
    }
    return config
}, (error: AxiosError) => {
    // 请求错误，这里可以用全局提示框进行提示
    // return Promise.reject(error);
})

//  response interceptor 接口响应拦截
service.interceptors.response.use(async (response: AxiosResponse) => {
    // 直接返回res，当然你也可以只返回res.data
    // 系统如果有自定义code也可以在这里处理
    if (response.status == 200) {
        if (response.data.code == 301) {
            ElMessage({
                message: response.data.msg,
                type: 'error',
            })
            router.push('/login')
            const userStore = useUserStore();
            const PermissionStore = usePermissionStore()
            await userStore.logout()
            await PermissionStore.clearRoutes()
        } else if (response.data.code != 200) {
            ElMessage({
                message: response.data.msg,
                type: 'error',
            })
        }
        return response.data
    }
}, (error: AxiosError) => {
    // return Promise.reject(error)
})


/**
 * @description 显示错误消息
 * opt 传入参数
 * err 错误信息
 * type 消息类型
 * duration 消息持续时间
 */
function showErrMessage(opt, err, type: any = 'error', duration: number = 5000) {
    ElMessage({
        message: err.msg,
        type: type,
        duration: duration
    })
}

export default service

export function downLoadExcel(url, params, name) {
    params = signature(params)
    const userStore = useUserStore();
    return new Promise((resolve, reject) => {
      axios
        .get(import.meta.env.VITE_BASE_URL + url, {
          params: params,
          responseType: "blob", // 1.首先设置responseType对象格式为 blob:
          headers: { accesstoken: userStore.accesstoken}
        })
        .then(
          res => {
            const blob = new Blob([res.data], {
              type: "application/vnd.ms-excel"
            }); // 2.获取请求返回的response对象中的blob 设置文件类型，这里以excel为例
            const url = window.URL.createObjectURL(blob); // 3.创建一个临时的url指向blob对象
            // 4.创建url之后可以模拟对此文件对象的一系列操作，例如：预览、下载
            const aBox = document.createElement("a");
            aBox.href = url;
            aBox.download = name + ".xlsx";
            aBox.click();
            // 5.释放这个临时的对象url
            window.URL.revokeObjectURL(url);
            // console.log(aBox);
            document.removeChild(aBox);
            resolve(true);
          },
          err => {
            resolve(false);
          }
        )
        .catch(error => {
          reject(error);
        });
    });
  }


  export function downLoadZip(url, params, name) {
    params = signature(params)
    const userStore = useUserStore();
    return new Promise((resolve, reject) => {
      axios
        .get(import.meta.env.VITE_BASE_URL + url, {
          params: params,
          responseType: "blob", // 1.首先设置responseType对象格式为 blob:
          headers: { accesstoken: userStore.accesstoken}
        })
        .then(
          res => {
            const blob = new Blob([res.data], {
              type: "aapplication/zip"
            }); // 2.获取请求返回的response对象中的blob 设置文件类型，这里以excel为例
            const url = window.URL.createObjectURL(blob); // 3.创建一个临时的url指向blob对象
            // 4.创建url之后可以模拟对此文件对象的一系列操作，例如：预览、下载
            const aBox = document.createElement("a");
            aBox.href = url;
            aBox.download = name + ".zip";
            aBox.click();
            // 5.释放这个临时的对象url
            window.URL.revokeObjectURL(url);
            // console.log(aBox);
            document.removeChild(aBox);
            resolve(true);
          },
          err => {
            resolve(false);
          }
        )
        .catch(error => {
          reject(error);
        });
    });
  }
